package com.surge;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

public class JDBCTest {

	private ApplicationContext ctx;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	{
		// 创建 Spring 的 IOC 容器
		ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		namedParameterJdbcTemplate = ctx.getBean(NamedParameterJdbcTemplate.class);
	}
	
	
	/**
	 *  使用具名参数
	 */
	/**
	 * 可以为参数起名字. 
	 * 1. 好处: 若有多个参数, 则不用再去对应位置, 直接对应参数名, 便于维护
	 * 2. 缺点: 较为麻烦. 
	 */
	@Test
	public void testNamedParameterJdbcTemplate(){
		String sql = "INSERT INTO users(name,age) VALUES(:na, :ag)";
		
		Map<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("na", "FF");
		paramMap.put("ag", 20);
		
		namedParameterJdbcTemplate.update(sql, paramMap);
	
	}
	
	
	/**
	 * 使用具名参数时, 可以使用 update(String sql, SqlParameterSource paramSource) 方法进行更新操作
	 * 1. SQL 语句中的参数名和类的属性一致!
	 * 2. 使用 SqlParameterSource 的 BeanPropertySqlParameterSource 实现类作为参数. 
	 */
	@Test
	public void testNamedParameterJdbcTemplate2(){
		String sql = "INSERT INTO users(name, age) "
				+ "VALUES(:name, :age)";
		
		Users users = new Users();
		users.setName("XYZ");
		users.setAge(21);
		
		SqlParameterSource paramSource = new BeanPropertySqlParameterSource(users);
		namedParameterJdbcTemplate.update(sql, paramSource);
	}
	

	
}
